
#include "Interpolacion.h"


Interpolacion::Interpolacion(vector<int>x,vector<int>y,int nElementos) {
    this->x=x;
    this->y=y;
    this->nElementos=nElementos;
}
void Interpolacion::GenerarCoeficientes(int limite)
{
    this->coeficientes.resize(limite);
    this->diferencias.resize(limite);
    
    coeficientes[0]=y[0];
    diferencias[0]=y[0];
    coeficientes[1]=((y[1]-y[0])/(x[1]-x[0]));
    diferencias[1]=((y[1]-y[0])/(x[1]-x[0]));
    
    for(int i=2;i<limite;i++)
    {
        long double temp=((y[i]-y[i-1])/(x[i]-x[i-1]));
        diferencias[i]=temp-diferencias[i-1];
        long double base=x[i]-x[0];
        coeficientes[i]=diferencias[i]/base;
        if(temp<=0){
            temp*=-1;
        }
        diferencias[i]=temp+diferencias[i-1];
    } 
}

double Interpolacion::InterpolacionNewton(int elemx, int limite)
{
    GenerarCoeficientes(limite);
    float resultado=y[0];
    for(int i=1;i<limite;i++)
    {
        float producto=1;
        for(int j=0;j<=i-1;j++)
        {
            producto*=(elemx-x[j]);
        }
        resultado+=(coeficientes[i]*producto);
    }
    return resultado;
}

double Interpolacion::InterpolacionLagrange(vector <int> x0,vector<int> y0,int elemx,int limite){
   double resultado=0;
  for(int i=0;i<limite;i++)
  {
      //cout<<" i :"<<i<<endl;
       double producto=1;
      for(int j=0;j<limite;j++)
      {
          if(i!=j){
              producto*=((elemx-x0[j])/(x0[i]-x0[j]));
          }
          //cout<<" j :"<<j<<endl;
      }
      resultado+=y0[i]*producto;
       }
   return resultado;
  }


bool Interpolacion::Contiene(vector<int> x, int elem){
    int i=0;
    while(i<x.size()){
        if(x[i]==elem)break;
        else i++;
    }
    return (!(i==x.size()));
}

vector<int> Interpolacion::GeneradorNumerosAleatorios(int limInf, int limSup, int n)
{
    vector<int> numAleatorios;
    numAleatorios.resize(n);
    int i=0;
    while(i<n)
    {
        int elem=(int)(limInf+rand()%limSup);
        if(!Contiene(numAleatorios,elem)){
            numAleatorios[i]=elem;
        //cout<<"Num aleatorio"<<numAleatorios[i]<<endl;
        i++;
        }
    }
    sort(numAleatorios.begin(),numAleatorios.end());
    //sort(numAleatorios.begin(),numAleatorios.begin()+numAleatorios.size());
    
    return numAleatorios;
}

void Interpolacion::GenerarArchivo(vector<int> x0, vector<double> y0, char* h,int limite)
{
    ofstream archivoSalida;
    archivoSalida.open(h);


    if(archivoSalida.is_open())
    {
        for(int i=0;i<limite;i++)
        {
            archivoSalida<<x0[i]<<"\t"<<y0[i]<<"\t"<<endl;
        }
    }
    archivoSalida.close();

}

double Interpolacion::ErrorLagrange(){
    
}



